function ajax(opts) {
    return  new Promise((resolve, reject) => {
        // 默认的配置
        const defalutOpt = {
            url: '',
            type: 'get',
            data: {},
            dataType: 'string',
            async: true, //是否同步
            success: function () {

            }
        }
        Object.prototype.toString.call('要检测的数据') // [object string]
        // 做传入参数类型限制
        // 1.url是一个字符串
        // 2.type是一个字符串 而且只能传get和post
        // 3.data是一个对象
        // 4.dataType是一个字符串  而且只能传string(将响应原样返回) json(将响应json解析之后返回)
        // 5.async 是一个布尔值
        // 6.success是一个函数类型
        // 将用户传入配置和默认的配置合并
        const option = { ...defalutOpt, ...opts }
        const xhr = new XMLHttpRequest
        let str = ''
        for (let name in option.data) {
            str += `${name}=${option.data[name]}&`
        }
        str = str.slice(0, -1)
        // 用户传过来参数数据 是一个对象  {a:1,b:2}   转换成 'a=1&b=2'
        // 如果是get方式 参数拼接地址后面 ?a=1&b=2
        // 若果是post方式  参数  send('a=1&b=2')  xhr.setHttpHeader
        if (option.type.toLowerCase() === 'get') {
            xhr.open(option.type, `${option.url}?${str}`, option.async)
            xhr.send()
        } else {
            xhr.open(option.type, option.url, option.async)
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            xhr.send(str)
        }
        xhr.onload = function () {
            let res = xhr.responseText
            if (option.dataType.toLowerCase() === 'json') {
                // 将json字符串转换成Js对象
                res = JSON.parse(res)
            }
            resolve(res)
        }
    })
}
